package com.me.singleton;

/**
 * @author inttom
 * @date 2022/2/13
 *
 * 解决了线程安全问题
 * 效率太低,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步,而其实这个方法只执行一次实例化代码就够了,后面再想获得该实例,直接return就行了.
 * 方法进行同步的效率太低
 *
 * 结论: 在实际开发中,不推荐使用这种方式
 */
public class SingletonTest04 {
    public static void main(String[] args) {
        new Thread(new MyThread2()).start();
        new Thread(new MyThread2()).start();
    }
}

class MyThread2 implements Runnable {

    @Override
    public void run() {
        Singleton4 instance = Singleton4.getInstance();
        System.out.println(Thread.currentThread().getName() + ": " + instance.hashCode());
    }
}

/**
 * 懒汉式(线程安全,同步方法)
 */
class Singleton4 {
    private static Singleton4 instance;
    private Singleton4() {
    }

    /**
     * 提供一个静态的公有方法,当使用到该方法的时候,才会去创建 instance
     * 懒汉式
     */
    public static synchronized Singleton4 getInstance() {
        if (instance == null) {
            instance = new Singleton4();
        }
        return instance;
    }
}


